import request from '@/utils/http'
import { BaseResponse } from './common'

// 用户状态枚举
export type UserStatus = 'active' | 'blocked' | 'deleted'

// 用户角色枚举
export type UserRole = 'normal' | 'vip'

// VIP类型枚举
export type VipType = 'monthly' | 'yearly' | 'lifetime'

// 性别枚举
export type Gender = 0 | 1 | 2 // 0未知，1男，2女

// 地址信息
export interface Address {
  id: string
  name: string // 收货人姓名
  phone: string // 收货人电话
  province: string // 省份
  city: string // 城市
  district: string // 区县
  detail: string // 详细地址
  isDefault: boolean // 是否默认地址
  createTime: number // 创建时间（秒级时间戳）
  updateTime: number // 更新时间（秒级时间戳）
}

// VIP信息
export interface VipInfo {
  type: VipType // VIP类型
  activatedAt: number // 激活时间（秒级时间戳）
  expiresAt?: number | null // 过期时间（终身会员为null）
  orderId: string // 关联订单ID
  isActive: boolean // 是否激活
}

// 用户实体
export interface User {
  _id?: string
  openid: string // 微信用户唯一标识
  nickName: string // 用户昵称
  avatarUrl: string // 用户头像
  phone: string // 手机号
  gender: Gender // 性别
  country: string // 国家
  province: string // 省份
  city: string // 城市
  addresses: Address[] // 地址列表
  role: UserRole // 用户角色
  status: UserStatus // 用户状态
  vipInfo?: VipInfo | null // VIP信息（仅VIP用户）
  createTime: number // 注册时间（秒级时间戳）
  updateTime: number // 更新时间（秒级时间戳）
  lastLoginTime: number // 最后登录时间（秒级时间戳）
  // 扩展字段 - 用于前端显示
  statusText?: string
  roleText?: string
  genderText?: string
  formattedCreateTime?: string
  formattedLastLoginTime?: string
  vipStatusText?: string
}

// 用户列表查询参数
export interface UserListParams {
  page?: number
  size?: number
  sort?: string
  order?: 'asc' | 'desc'
  status?: UserStatus
  role?: UserRole
  keyword?: string // 搜索关键字（昵称、手机号、openid）
}

// 用户列表响应
export interface UserListResponse {
  data: User[]
  total: number
  code: number
  message: string
}

// 更新用户参数
export interface UpdateUserParams {
  role?: UserRole
  status?: UserStatus
}

// 更新VIP信息参数
export interface UpdateVipParams {
  type: VipType
  activatedAt: number
  expiresAt?: number | null
  orderId: string
  isActive: boolean
}

// 通用响应消息
export interface UserActionResponse {
  message: string
}

export class UserService {
  // 获取用户列表
  static getUserList(params?: UserListParams) {
    return request.get<BaseResponse<User[]>>({
      url: '/api/v1/admin/user/list',
      params
    })
  }

  // 获取用户详情
  static getUserDetail(openid: string) {
    return request.get<BaseResponse<User>>({
      url: `/api/v1/admin/user/detail/${openid}`
    })
  }

  // 更新用户信息
  static updateUser(openid: string, params: UpdateUserParams) {
    return request.put<BaseResponse<UserActionResponse>>({
      url: `/api/v1/admin/user/update/${openid}`,
      params
    })
  }

  // 更新用户VIP信息
  static updateUserVip(openid: string, params: UpdateVipParams) {
    return request.put<BaseResponse<UserActionResponse>>({
      url: `/api/v1/admin/user/vip/${openid}`,
      params
    })
  }
}

// 工具函数

// 获取用户状态文本
export const getUserStatusText = (status: UserStatus): string => {
  const texts: Record<UserStatus, string> = {
    active: '正常',
    blocked: '已封禁',
    deleted: '已删除'
  }
  return texts[status] || status
}

// 获取用户状态标签类型
export const getUserStatusTagType = (status: UserStatus): string => {
  const types: Record<UserStatus, string> = {
    active: 'success',
    blocked: 'warning',
    deleted: 'danger'
  }
  return types[status] || 'info'
}

// 获取用户角色文本
export const getUserRoleText = (role: UserRole): string => {
  const texts: Record<UserRole, string> = {
    normal: '普通用户',
    vip: 'VIP用户'
  }
  return texts[role] || role
}

// 获取用户角色标签类型
export const getUserRoleTagType = (role: UserRole): string => {
  const types: Record<UserRole, string> = {
    normal: 'info',
    vip: 'warning'
  }
  return types[role] || 'info'
}

// 获取性别文本
export const getGenderText = (gender: Gender): string => {
  const texts: Record<Gender, string> = {
    0: '未知',
    1: '男',
    2: '女'
  }
  return texts[gender] || '未知'
}

// 获取VIP类型文本
export const getVipTypeText = (type: VipType): string => {
  const texts: Record<VipType, string> = {
    monthly: '月度会员',
    yearly: '年度会员',
    lifetime: '终身会员'
  }
  return texts[type] || type
}

// 获取VIP状态文本
export const getVipStatusText = (user: User): string => {
  if (!user.vipInfo || user.role !== 'vip') {
    return '非VIP'
  }

  if (!user.vipInfo.isActive) {
    return 'VIP未激活'
  }

  if (user.vipInfo.type === 'lifetime') {
    return '终身VIP'
  }

  if (user.vipInfo.expiresAt) {
    const now = Math.floor(Date.now() / 1000)
    if (user.vipInfo.expiresAt > now) {
      return `VIP有效期至${formatDate(user.vipInfo.expiresAt, 'date')}`
    } else {
      return 'VIP已过期'
    }
  }

  return '未知VIP状态'
}

// 判断VIP是否有效
export const isVipValid = (user: User): boolean => {
  if (!user.vipInfo || user.role !== 'vip' || !user.vipInfo.isActive) {
    return false
  }

  if (user.vipInfo.type === 'lifetime') {
    return true
  }

  if (user.vipInfo.expiresAt) {
    const now = Math.floor(Date.now() / 1000)
    return user.vipInfo.expiresAt > now
  }

  return false
}

// 格式化时间
export const formatDate = (timestamp?: number, type: 'datetime' | 'date' = 'datetime'): string => {
  if (!timestamp) return '-'

  try {
    const date = new Date(timestamp * 1000)
    if (isNaN(date.getTime())) {
      return timestamp.toString()
    }

    if (type === 'date') {
      return date
        .toLocaleDateString('zh-CN', {
          year: 'numeric',
          month: '2-digit',
          day: '2-digit'
        })
        .replace(/\//g, '-')
    }

    return date
      .toLocaleString('zh-CN', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit'
      })
      .replace(/\//g, '-')
  } catch (error) {
    console.error('时间格式化错误:', error, timestamp)
    return timestamp?.toString() || '-'
  }
}

// 生成默认地址
export const generateDefaultAddress = (): Partial<Address> => ({
  name: '',
  phone: '',
  province: '',
  city: '',
  district: '',
  detail: '',
  isDefault: false
})

// 验证手机号
export const isValidPhone = (phone: string): boolean => {
  const phoneRegex = /^1[3-9]\d{9}$/
  return phoneRegex.test(phone)
}

// 判断是否可以操作用户
export const canOperateUser = (user: User): boolean => {
  return user.status !== 'deleted'
}

// 判断是否可以设置VIP
export const canSetVip = (user: User): boolean => {
  return user.status === 'active' && user.role === 'normal'
}

// 判断是否可以取消VIP
export const canCancelVip = (user: User): boolean => {
  return user.status === 'active' && user.role === 'vip'
}
